Java 线程池的实现

线程池的实现

   组成

    一个比较简单的线程池至少应包括

        线程池管理器:创建、销毁并管理线程池,将工作线程放入线程池中;

        工作线程:一个可以循环执行任务的线程,在没有任务时进行等待;

        任务队列:提供一种缓冲机制,将没有处理的任务放在任务队列中;

        任务接口:每个任务必须实现的接口,主要用来规定任务的入口、任务执行完后的收尾工作、任务的执行状态等。 工作线程通过该接口调度任务的执行。

   原理

   类似于操作系统中的缓冲区,流程如下:

   先启动若干数量的线程,并让这些线程都处于等待状态,当客户端有一个新请求时,就会唤醒线程池中的某一个等待线程,让他来处理客户端的这个请求,当处理完后,继续处于等待状态。

代码实现

   ThreadPoolManager类: 管理线程池,初始化线程池,并为客户端请求分配不同的线程来处理;

   SimpleThread类:Thread类的一个子类,对客户端请求进行处理的类,初始化时均为睡眠状态,若接收到ThreadPoolManager的调度,则会唤醒线程。

package thread;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;


public class threadpool {
        
    static class ThreadPoolManager{
            private int MaxThread;
            private Vector ThreadQueue;
            
            public void setMaxThread(int count){
                this.MaxThread=count;
            }
            
            public ThreadPoolManager(int count){
                setMaxThread(count);
                System.out.println("Starting Thread Pool");
                ThreadQueue=new Vector();
                for(int i=0;i<=MaxThread;i++){
                    SimpleThread thread=new SimpleThread(i);
                    ThreadQueue.addElement(thread);
                    thread.start();
                }
            }
            
            public void process(String argument){
                int i;
                for(i=0;i<ThreadQueue.size();i++){
                    SimpleThread current=(SimpleThread) ThreadQueue.elementAt(i);
                    if(!current.isRunning()){
                        System.out.println("Thread"+(i+1)+"is processing:"+argument);
                        current.setArgument(argument);
                        current.setRunning(true);
                        return;
                    }
                }
                
                if(i==ThreadQueue.size()){
                    System.out.println("pool is full,try in anthor time");
                }
            }
            
    }
    
    
    static class SimpleThread extends Thread{
        private boolean RunningFlag;
        private String argument;
        public boolean isRunning(){
            return RunningFlag;
        }
        
        public synchronized void setRunning(Boolean Flag){
            RunningFlag=Flag;
            if(Flag){
                this.notify();
            }
        }
        
        public String getArgument(){
            return this.argument;
        }
        
        public void setArgument(String string){
            argument=string;
        }
        
        public SimpleThread(int threadNumber){
            RunningFlag=false;
            System.out.println("thread"+threadNumber+"started.");
        }
        
        public synchronized void run(){
            try {
                while(true){
                    if(!RunningFlag){
                        this.wait();
                    }
                    else{
                        System.out.println("process"+getArgument()+"……done!");
                        sleep(5000);
                        System.out.println("Thread is sleeping.");
                        setRunning(false);
                        
                    }
                }
            } catch (Exception e) {
                // TODO: handle exception
                System.out.println("Interrupt");
            }
        }
    }
    
    public static void main(String[] args) {
        try {
            BufferedReader brBufferedReader=new BufferedReader(new InputStreamReader(System.in));
            String string;
            ThreadPoolManager manager=new ThreadPoolManager(10);
            while((string=brBufferedReader.readLine())!=null){
                manager.process(string);
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
    
    
}

 

   

   

 

posted @ 2017-05-29 14:47  Rekent  阅读(325)  评论(0编辑  收藏  举报